package cn.hgj.repository;

import cn.hgj.entity.Order;
import cn.hgj.enums.OrderStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Repository
public interface OrderRepository extends JpaRepository<Order, String> {

    @Query("from Order")
    List<Order> findOrders();

    /**
     * 根据订单ID查找订单
     * @param orderId 订单ID
     * @return 订单对象
     */
    Optional<Order> findByOrderId(String orderId);

    /**
     * 根据用户ID查找订单
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Order> findByUserId(String userId);

    /**
     * 根据用户ID和状态查找订单
     * @param userId 用户ID
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> findByUserIdAndStatus(String userId, OrderStatus status);

    /**
     * 根据状态查找订单
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> findByStatus(OrderStatus status);

    /**
     * 根据状态和创建时间范围查找订单
     * @param status 订单状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    List<Order> findByStatusAndCreateTimeBetween(
            OrderStatus status,
            LocalDateTime startTime,
            LocalDateTime endTime);

    /**
     * 根据状态和创建时间之前查找订单
     * @param status 订单状态
     * @param createTime 截止时间
     * @return 订单列表
     */
    List<Order> findByStatusAndCreateTimeBefore(
            OrderStatus status,
            LocalDateTime createTime);

    /**
     * 更新订单状态
     * @param orderId 订单ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @return 更新记录数
     */
    @Modifying
    @Transactional
    @Query("UPDATE Order o SET o.status = :newStatus, o.updateTime = CURRENT_TIMESTAMP " +
            "WHERE o.orderId = :orderId AND o.status = :oldStatus")
    int updateOrderStatus(
            @Param("orderId") String orderId,
            @Param("oldStatus") OrderStatus oldStatus,
            @Param("newStatus") OrderStatus newStatus);

    /**
     * 更新订单状态和支付信息
     * @param orderId 订单ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @param paymentId 支付ID
     * @param paymentTime 支付时间
     * @return 更新记录数
     */
    @Modifying
    @Transactional
    @Query("UPDATE Order o SET o.status = :newStatus, " +
            "o.paymentId = :paymentId, o.paymentTime = :paymentTime, " +
            "o.updateTime = CURRENT_TIMESTAMP " +
            "WHERE o.orderId = :orderId AND o.status = :oldStatus")
    int updateOrderWithPayment(
            @Param("orderId") String orderId,
            @Param("oldStatus") OrderStatus oldStatus,
            @Param("newStatus") OrderStatus newStatus,
            @Param("paymentId") String paymentId,
            @Param("paymentTime") LocalDateTime paymentTime);

    /**
     * 根据订单ID和状态查找订单（用于状态转换）
     * @param orderId 订单ID
     * @param status 订单状态
     * @return 订单对象
     */
    @Query("SELECT o FROM Order o WHERE o.orderId = :orderId AND o.status = :status")
    Optional<Order> findByIdAndStatusForUpdate(
            @Param("orderId") String orderId,
            @Param("status") OrderStatus status);
}